/*
 * Copyright (c) 2020-2099 the original author or authors. All rights reserve.
 */
package org.tianyun.cloud.mybatis.mapper;

import org.tianyun.cloud.common.domain.BaseDomain;

import java.io.Serializable;
import java.util.List;

/**
 * BaseMapper
 *
 * @author ebert_chan
 */
public interface BaseMapper<PK extends Serializable, T extends BaseDomain> {

    /**
     * 保存，insert into table(...) values (...)
     *
     * @param domain 数据库表映射对象
     * @return Integer 影响行数
     * @author ebert_chan
     */
    Integer save(T domain);

    /**
     * 批量保存, insert into table(...) values (...),(...)
     *
     * @param domainList 数据库表映射对象列表
     * @return Integer 影响行数
     * @auther ebert_chan
     */
    Integer batchSave(List<T> domainList);

    /**
     * 删除, delete from table where id=pk
     *
     * @param pk 主键
     * @return Integer 删除行数
     * @author ebert_chan
     */
    Integer remove(PK pk);

    /**
     * 根据条件删除, delete from table where id=pk and ...
     *
     * @param domain 数据库表映射对象
     * @return Integer 删除行数
     * @auther ebert_chan
     */
    Integer removeBySelective(T domain);

    /**
     * 批量删除, delete from table where id in (...)
     *
     * @param pkList 主键列表
     * @return Integer 删除行数
     * @auther ebert_chan
     */
    Integer batchRemove(List<PK> pkList);

    /**
     * 更新, update table set [...] where id=pk
     *
     * @param domain 数据库表映射对象
     * @return Integer 更新行数
     * @author ebert_chan
     */
    Integer update(T domain);

    /**
     * 选择性更新, update table set [...] where id=pk and ...
     *
     * @param domain 数据库表映射对象
     * @return Integer 更新行数
     * @auther ebert_chan
     */
    Integer updateBySelective(T domain);

    /**
     * 查询, select [...] from table where id=pk
     *
     * @param pk 主键
     * @return E 实体类
     * @author ebert_chan
     */
    T get(PK pk);

    /**
     * 根据指定条件查询数据
     *
     * @param domain 数据库表映射对象
     * @return T 数据库表映射对象
     * @auther ebert_chan
     */
    T getBySelective(T domain);

    /**
     * 根据查询条件筛选数据，结果以List集合返回
     *
     * @param domain 数据库表映射对象
     * @return List<E> 数据库表映射对象集合
     * @author ebert_chan
     */
    List<T> listBySelective(T domain);

}